//: C19:DelayedInstantiation.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 1999
// Copyright notice in Copyright.txt
// Member functions of class templates are not
// instantiated until they're needed.

class X
{
public:
    void f() {}
};

class Y
{
public:
    void g() {}
};

template <typename T> class Z
{
    T t;
public:
    void a() {
        t.f();
    }
    void b() {
        t.g();
    }
};

int main()
{
    Z<X> zx;
    zx.a(); // Doesn't create Z<X>::b()
    Z<Y> zy;
    zy.b(); // Doesn't create Z<Y>::a()
} ///:~
